查看原文
其他

IoT安全:调试环境搭建教程(AArch64篇)

wooyoung 看雪学院 2019-05-25

0x001 前言


IoT设备固件的调试环境搭建坑比较多,发现网上还没有比较完善的各架构的调试环境的入门贴,于是就有了这篇文章,希望能方便到刚上手的新人吧。本文只是该教程的第一篇,因篇章过长不得不分开,整个教程会包含ARM、MIPS、x86、x64等等qemu调试环境的搭建。



0x002  AArch64


  • 主机:Ubuntu 16.04 LST(可以是VM里跑的虚拟系统,也可以用真实机器)

  • 虚拟机版本: qemu 2.8.0

  • Linux内核版本:4.10

  • BusyBox版本:1.24.2

  • 交叉编译工具链:gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux

  • gdb版本:7.11.1

  • 根文件系统:aarch64_rootfs.tar



以上工具已经打包好,下载地址如下。


链接:

https://pan.baidu.com/s/1MVZhhTlhrNQH9KkvqFLSMw 

密码:

bzmx


先安装这些包:

$ sudo apt-get install libcap-dev

$
sudo apt-get install libpixman-1-dev

$
apt-get install libncurses5-dev

$
sudo apt-get install libasound2-dev libasound2

$
sudo apt-get install libglib2.0-dev

$
sudo apt install u-boot-tools


编译qemu

$ tar -xf qemu-2.8.0.tar.xz

$
cd qemu-2.8.0

$
mkdir build

$
cd build

$
../configure --target-list=arm-softmmu,aarch64-softmmu,mips-softmmu,mipsel-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,aarch64-linux-user,i386-linux-user,x86_64-linux-user,mips-linux-user,mipsel-linux-user --audio-drv-list=alsa --enable-virtfs

$
make -j8

$
sudo make install


配置linux内核选项

$ tar -xf linux-4.10.tar.xz



$
cross_compile=/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-

$
make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 defconfig

$
sudo gedit .config



#
CONFIG 9P

CONFIG_NET_9P=y

CONFIG_NET_9P_VIRTIO=y

CONFIG_NET_9P_DEBUG=y

CONFIG_9P_FS=y

CONFIG_9P_FS_POSIX_ACL=y

CONFIG_PCI=y

CONFIG_VIRTIO_PCI=y



#
CONFIG PCI and virtio

CONFIG_PCI=y

CONFIG_VIRTIO_PCI=y

CONFIG_PCI_HOST_GENERIC=y



$
make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 menuconfig



General setup  --->

   [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support



Device Drivers  --->

   [*] Block devices  --->

       <*>   RAM block device support

       (65536) Default RAM disk size (kbytes)






编译

$ make CROSS_COMPILE=$cross_compile ARCH=arm64 O=./out_aarch64 Image -j4


制作根文件系统

$ tar -xjvf busybox-1.24.2.tar.bz2



$
make menuconfig



Build Options  --->

   [*] Build BusyBox as a static binary (no shared libs)

   (/root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-)Cross Compiler prefix



$
make && make install




修改根文件系统,添加开机自启动挂载共享文件。

$ sudo gedit ./etc/init.d/rcS



mkdir /nfsroot

mount -t 9p -o trans=virtio,version=9p2000.L hostshare /nfsroot


因为采用9p的方式挂载共享文件,必须在编译内核和qemu时添加9p支持

制作启动用的ramdisk,注意修改交叉编译链的路径。

$ tar -xzvf aarch64_ramdisk_rootfs.tar.gz



# mk_ramdisk.sh

#!/bin/bash

sudo rm -rf rootfs

sudo rm -rf tmpfs

sudo rm -rf ramdisk*

sudo mkdir rootfs

sudo cp ../busybox-1.24.2/_install/*  rootfs/ -raf

sudo mkdir -p rootfs/proc/

sudo mkdir -p rootfs/sys/

sudo mkdir -p rootfs/tmp/

sudo mkdir -p rootfs/root/

sudo mkdir -p rootfs/var/

sudo mkdir -p rootfs/mnt/

sudo cp etc rootfs/ -arf

sudo mkdir -p rootfs/lib

sudo cp -arf /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/

sudo rm rootfs/lib/*.a

sudo /root/toolchain/gcc/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/*

sudo mkdir -p rootfs/dev/

sudo mknod rootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2 c 4 2

sudo mknod rootfs/dev/tty3 c 4 3

sudo mknod rootfs/dev/tty4 c 4 4

sudo mknod rootfs/dev/console c 5 1

sudo mknod rootfs/dev/null c 1 3

sudo dd if=/dev/zero of=ramdisk bs=1M count=16

sudo mkfs.ext4 -F ramdisk

sudo mkdir -p tmpfs

sudo mount -t ext4 ramdisk ./tmpfs/  -o loop

sudo cp -raf rootfs/*  tmpfs/

sudo umount tmpfs

sudo gzip --best -c ramdisk > ramdisk.gz

sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img


主机安装网络配置工具

$ sudo apt-get install uml-utilities

$
sudo apt-get install bridge-utils


在主机中查看/dev/net/tun文件

$ ls -l /dev/net/tun

crw-rw-rw- 1 root root 10, 200 Feb 27 03:36 /dev/net/tun


修改主机/etc/network/interfaces文件

# This file describes the network interfaces available on your system

# and how to activate them. For more information, see interfaces(5).



# The loopback network interface

auto lo

iface lo inet loopback



# The primary network interface

auto eth0



auto br0

iface br0 inet dhcp

  bridge_ports eth0


为了方便请参考该文章把ens33网卡名改成eth0。


ubuntu修改ens33网卡名为eth0。


添加/etc/qemu-ifup

#!/bin/sh

echo sudo tunctl -u $(id -un) -t $1

sudo tunctl -u $(id -un) -t $1



echo sudo ifconfig $1 0.0.0.0 promisc up

sudo ifconfig $1 0.0.0.0 promisc up



echo sudo brctl addif br0 $1

sudo brctl addif br0 $1



echo brctl show

brctl show



sudo ifconfig br0 192.168.1.156    # 这里需要查看Ubuntu dhcp方式分配的ip,并与该ip保持一致,否则qemu起来后主机会连不上外部网络


添加/etc/qemu-ifdown

#!/bin/sh

echo sudo brctl delif br0 $1

sudo brctl delif br0 $1



echo sudo tunctl -d $1

sudo tunctl -d $1

 

echo brctl show

brctl show



ifdown br0

ifup br0


添加可执行权限

$ chmod +x /etc/qemu-ifup

$
chmod +x /etc/qemu-ifdown


重启网卡

$ sudo /etc/init.d/networking restart


运行

# run.sh

sudo qemu-system-aarch64 \

   -M  virt \

   -cpu cortex-a53 \

   -smp 2 \

   -m 4096M \

   -kernel ./Image \

   -nographic \

   -append "root=/dev/ram0 rw rootfstype=ext4 console=ttyAMA0 init=/linuxrc ignore_loglevel" \

   -initrd ./ramdisk.img \

   -fsdev local,security_model=passthrough,id=fsdev0,path=/nfsroot \

   -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare \

   -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \

   -redir tcp:2333::2333




设置Vmware虚拟机网络



测试能双向ping通





qemu起来后,ip不一定能分配到,而且这是精简内核,没有interfaces这文件,可以通过这条命令设置一下ip。

ifconfig eth0 192.168.1.20


编译gdb-7.11.1

$ CC="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-gcc" CXX="/root/toolchain/gcc/aarch64/bin/aarch64-linux-gnu-g++" ./configure --target=aarch64-linux-gnu --host="aarch64-linux-gnu" --prefix="/root/toolchain/gdb/gdb-7.11.1/gdb/gdbserver/out_aarch64"

$
make install


交叉编译测试例程

$ mkdir build && cd build

$ nano hello.c

#include <stdio.h>



int main()

{

   printf("hello\n");

   return 0;

}



$ ./arm-none-linux-gnueabi-gcc -g hello.c -o hello_aarch64 -static


编译好的gdbserver与测试例程拷贝到虚拟机共享文件,执行。

$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64


gdbserver报错,原因是没有编译静态文件。

-/bin/sh: ./gdbserver-aarch64: not found


修改gdbserver的Makefile,添加-static参数,再次编译。



客户机执行

$ ./gdbserver-aarch64 0.0.0.0:2333 ./hello_aarch64


主机中执行

$ gdb-multiarch

gef➤ set architecture aarch64

The target architecture is assumed to be aarch64

gef➤ gef-remote -q 192.168.1.20:2333


gef工具的安装可以参考这篇:


《ARM汇编基础教程番外篇——配置实验环境》(点击阅读原文即可获取)


至此,AArch64调试环境已经搭建好了,不知不觉已经写了这么多。本来打算将AArch32也放一起的,看来只能放在下篇了。



- End -


看雪ID:wooyoung              

https://bbs.pediy.com/user-757748.htm


本文由看雪论坛 wooyoung 原创

转载请注明来自看雪社区




热门图书推荐:

立即购买!



(点击图片即可进入)



推荐阅读


Windows漏洞利用开发 - 第4部分:使用跳转定位Shellcode 模块 | 看雪·19


Windows漏洞利用开发 - 第3部分:偏移更改和重定位模块 | 看雪·19



Windows漏洞利用开发 - 第2部分:栈溢出简介 | 看雪·19




Windows漏洞利用开发 - 第1部分:基础知识 | 看雪·19








公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


点击下方“阅读原文”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存